
package br.com.gkarian.mydesk.controller.financeiro;

import java.util.List;

import org.apache.log4j.Logger;

import br.com.caelum.vraptor.Delete;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Put;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.validator.ValidationMessage;
import br.com.gkarian.mydesk.anotacoes.RestritoUsuario;
import br.com.gkarian.mydesk.model.Usuario;
import br.com.gkarian.mydesk.model.financeiro.Transacao;
import br.com.gkarian.mydesk.services.financeiro.interfaces.FinanceiroServiceProxy;
import br.com.gkarian.mydesk.web.UsuarioWeb;

@Resource
@RestritoUsuario
public class TransacaoController {

	private static final Logger LOG = Logger.getLogger(TransacaoController.class);
	
	private Result result;
	private Validator validator;
	private UsuarioWeb usuarioWeb;
	private FinanceiroServiceProxy financeiroServiceProxy;
	
	public TransacaoController(Result result, Validator validator,
			UsuarioWeb usuarioWeb,
			FinanceiroServiceProxy financeiroServiceProxy) {
		this.result = result;
		this.validator = validator;
		this.usuarioWeb = usuarioWeb;
		this.financeiroServiceProxy = financeiroServiceProxy;
	}
	
	@Get("/financeiro/transacao/cadastrar")
	public void cadastrarTransacao() {
		try {
			//TODO: validar existencia de conta_usuario para permitir cadastro
			Usuario usuario = financeiroServiceProxy.recuperarUsuarioParaCadastroTransacao(usuarioWeb.getLogado());
			result.include("listContasBancarias", usuario.getListContasBancarias());
			result.include("listTipoTransacao", usuario.getListTipoTransacao());
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
			validator.add(new ValidationMessage("erro.inesperado", "error"));
			validator.onErrorRedirectTo(this).cadastrarTransacao();
		}
	}
	
	@Post("/financeiro/transacao/cadastrando")
	public void cadastrarTransacao(Transacao transacao) {
		validator.validate(transacao);
		validator.onErrorRedirectTo(this).cadastrarTransacao();
		
		try {
			financeiroServiceProxy.cadastrarTransacao(transacao, usuarioWeb.getLogado());
			result.redirectTo(this).cadastrarTransacao();
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
			validator.add(new ValidationMessage("erro.inesperado", "error"));
			validator.onErrorRedirectTo(this).cadastrarTransacao();
		}
	}

	@Get("/financeiro/transacao/listar")
	public void listarTransacoes() {
		try {
			List<Transacao> listaTransacao = financeiroServiceProxy.listarTransacoesPorUsuario(usuarioWeb.getLogado());
			result.include("listTransacao", listaTransacao);
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
			validator.add(new ValidationMessage("erro.inesperado", "error"));
			validator.onErrorRedirectTo(this).cadastrarTransacao();
		}
	}
	
	@Delete("/financeiro/transacao/{id}/remover")
	public void removerTransacao(Integer id) {
		try {
			//TODO: enviar tudo para o Servico
			Transacao transacao = financeiroServiceProxy.carregarTransacao(id);
			financeiroServiceProxy.removerTransacao(transacao, usuarioWeb.getLogado());
			result.redirectTo(this).listarTransacoes();
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
			validator.add(new ValidationMessage("erro.inesperado", "error"));
			validator.onErrorRedirectTo(this).cadastrarTransacao();
		}
	}
	
	@Get("/financeiro/transacao/{id}/editar")
	public void editarTransacao(Integer id) {
		try {
			//TODO: validar que transacao pertence ao usuario
			//TODO: uma soh chamada
			Transacao transacao = financeiroServiceProxy.carregarTransacao(id);
			Usuario usuario = financeiroServiceProxy.recuperarUsuarioParaCadastroTransacao(usuarioWeb.getLogado());
			result.include("transacao", transacao);
			result.include("listContasBancarias", usuario.getListContasBancarias());
			result.include("listTipoTransacao", usuario.getListTipoTransacao());
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
			validator.add(new ValidationMessage("erro.inesperado", "error"));
			validator.onErrorRedirectTo(this).listarTransacoes();
		}
	}
	
	@Put("/financeiro/transacao/editando")
	public void editar(Transacao transacao) {
		validator.validate(transacao);
		validator.onErrorRedirectTo(this).listarTransacoes();
		
		try {
			financeiroServiceProxy.atualizarTransacao(transacao, usuarioWeb.getLogado());
			result.redirectTo(this).listarTransacoes();
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
			validator.add(new ValidationMessage("erro.inesperado", "error"));
			validator.onErrorRedirectTo(this).listarTransacoes();
		}
	}
	
	
	
}
